import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
import java.util.Map;

public class KantineAanbod {
	// Interne opslag voorraad.
	private HashMap<String, ArrayList<Artikel>> aanbod;
	private ArrayList<Artikel> artikel;

	/**
	 * Constructor. Het eerste argument is een lijst met artikelnamen,
	 * het tweede argument is een lijst met prijzen en het derde argument
	 * is een lijst met hoeveelheden. Let op: de dimensies van de drie arrays
	 * moeten wel gelijk zijn!
	 */
	public KantineAanbod( )
	{
		aanbod = new HashMap<String, ArrayList<Artikel>>();
				
	}
	
	/**
	 * Stuurt alle artikelnamen terug in een array
	 * @return array met artikelnamen
	 */
	public String[] getArtikelNamen( ) {
		ArrayList<String> listArray = new ArrayList<String>();
		
		Set set = aanbod.entrySet();
	    Iterator it = set.iterator();
	    while (it.hasNext()) {
	      Map.Entry entry = (Map.Entry) it.next();
	      String str = (String) entry.getKey();
	      listArray.add( str );
	    }
		
		String []strArray = new String[aanbod.size()];
		return listArray.toArray(strArray);
	}
	
	public int getAantalArtikelen() {
		return aanbod.size();
	}
	
	/**
	* Private methode om de lijst van artikelen te krijgen op basis van de
	* naam van het artikel. Retourneert null als artikel niet bestaat.
	* @param productnaam
	* @return arraylist met artikelen (of null)
	*
	*/
	private ArrayList<Artikel> getArrayList(String productnaam) {
		// Haalt de ArrayList doormiddel van de opgegeven naam.
		ArrayList<Artikel> artList = aanbod.get( productnaam ); 
		return artList;
	}
	
	/**
	* Private methode om een Artikel van de stapel artikelen af te pakken.
	* Retourneert null als de stapel leeg is.
	* @param lijst met artikelen
	* @return een artikel (of null)
	*/
	
	private Artikel getArtikel(ArrayList<Artikel> stapel){
		ArrayList<Artikel> list = aanbod.get( stapel );
		Artikel art = list.get( 0 );
		if (list==null) {
			return null;
		}
		if (list.size()==0)
		{
			throw new IllegalArgumentException( "Geen voorraad meer voor dit product." );
		} else {
			aanbod.remove( 0 );
		}
		return art;
	}
	
	public void addSupplies( String naam, int aantal ) {
		ArrayList<Artikel> artList = aanbod.get( naam );
		Artikel art = aanbod.get( naam ).get( 0 );
		
		for( int i = 0; i < aantal; i++ ) {
			artList.add( art );
		}
		
	}
	
	public void addArtikel( Artikel art, int aantal ) {
		artikel = new ArrayList<Artikel>();
		for( int i = 0; i < aantal; i++ ) {
			artikel.add( i , art);
		}
		aanbod.put( art.getArtikelNaam(), artikel );
	}
	
	
	/**
	* Publieke methode om een artikel via naam van de stapel te pakken.
	* Retouneert null als artikel niet bestaat of niet op voorraad is.
	* @param naam (van artikel)
	* @return artikel (of null)
	*/
	public Artikel getArtikel(String naam) {
		Artikel art = aanbod.get( naam ).get( 0 );
		
		//Als de voorraad lager is dan 5 artikelen
		if( aanbod.get( naam ).size() < 5 ) {
			//Vul de voorraad dan bij met 500 Artikelen van het desbetreffende artikel
			addSupplies( naam, 500 );
		}
		
		if( aanbod.get( naam ).isEmpty() ) {
			return null;
		} else {
			aanbod.remove( art );
		}
		return art;
	}
}